#pragma once
#include <sys/ipc.h>
#include <sys/shm.h>
#include <iostream>
using namespace std;
#include <string>

const string path = "/lesson/lesson31";
int gprojId = 0x666;
int gshmsize = 4096;
mode_t gmode = 0600;
class ShareMemory
{
private:
    // int shmget(key_t key, size_t size, int shmflg);
    void CreateShmHelper(int shmflg)
    {
        _key = ftok(path.c_str(), gprojId); // 前面的参数是路径，后面是随便一个数字
        if (_key < 0)
        {
            cerr << "ftok false" << endl;
            return;
        }
        _shmid = shmget(_key, gshmsize, shmflg);
        if (_shmid < 0)
        {
            cerr << "shmget false" << endl;
            return;
        }
        cout << "CreateShm sucess" << endl;
    }

public:
    ShareMemory()
        : _shmid(-1), _key(0), _addr(nullptr)
    {
    }
    ~ShareMemory() {}
    void CreateShm()
    {
        if (_shmid = -1) // 不存在就创建，有的话就出错返回
            CreateShmHelper(IPC_CREAT | IPC_EXCL | gmode);
    }
    int Getshm()
    { // 单独用，不存在就创建，有的话就获取它返回
        if (_shmid = -1)
            CreateShmHelper(IPC_CREAT);
        return _shmid;
    }
    void AttachShm()
    {
        // 把共享内存挂载到进程上
        // 返回一个虚拟地址--开辟好的地址的虚拟地址
        _addr = shmat(_shmid, nullptr, 0);
        if ((long long)_addr == -1)
        {
            cerr << "attach false" << endl;
        }
    }
    void DetachShm()
    {
        // 让进程和共享内存分离
        if (_addr != nullptr)
        {
            shmdt(_addr);
        }
        cout << "depatch sucess" << endl;
    }
    void *Getaddr()
    {
        return _addr;
    }

private:
    key_t _key;
    int _shmid;
    void *_addr;
};
struct data
{
    char status[32];
    char lasttime[48];
    char image[4000];
};